
const { Axios } = require('./axios');

const { merge } = require('lodash');


// 定义 ContentType 类型
const ContentTypeEnum = {
    // json
    JSON: 'application/json;charset=UTF-8',
    // form-data   上传资源（图片，视频）
    FORM_DATA: 'multipart/form-data'
}

function getToken() {
    return '';
}

// 默认配置
const defaultOptions = {
    // 默认超时时间
    timeout: 1000 * 10,
    // baseUrl
    baseURL: 'http://127.0.0.1:3000',
    // 请求头
    headers: {
        'Content-Type': ContentTypeEnum.FORM_DATA
    },
    // 处理 axios 的hooks
    axiosHooks: {
        useRequestInterceptors(config) {
            // 此处可以调用加载进度条开始
            const { headers } = config
            // 添加 Token 有的接口不去要添加 token
            if (config.withToken) {
                const token = getToken();
                // token 可能放在 body 上，也可能放在 headers 上，也可能放在别的地方上
                config.headers.token = token
            }

            config.headers = headers
            return config
        },
        requestInterceptorsCatchHook(err) {
            // 此处可以调用网络加载进度条结束
            return err
        },
        responseInterceptorsHook(response) {
            const { isTransformResponse, isReturnDefaultResponse } = response.config.requestOptions;
            // 是否返回默认的响应
            if (isReturnDefaultResponse) {
                return response;
            }
            // 是否需要对返回数据进行处理
            if (isTransformResponse) {
                const { code, data } = response.data;
                /*
                    根据当前项目的情况去处理状态码
                    */
                /**
                 * 可以在此定义一个枚举表示状态码
                */
                const RequestCodeEnum = {
                    success: 0,
                    fail: 500
                }
                switch (code) {
                    case RequestCodeEnum.success:
                        // alert('成功')
                        return data;
                    case RequestCodeEnum.fail:
                        // alert('失败')
                        return data;
                    default:
                        return data;
                }
            } else {
                return response.data;
            }
        },
        responseInterceptorsCatchHook(error) {
            // alert(error)
            return Promise.reject(error)
        }
    },
    requestOptions: {
        // 接口默认前缀
        urlPrefix: "",
        //是否返回默认的响应
        isReturnDefaultResponse: false,
        // 需要对返回数据进行处理
        isTransformResponse: true,
        // 是否携带token
        withToken: true,
        // 开启请求超时重新发起请求请求机制
        isOpenRetry: true,
        // 重新请求次数
        retryCount: 2
    }
}

function createAxios(options = {}) {
    return new Axios(
        // 深度合并
        merge(defaultOptions, options)
    )
}
const request = createAxios()

exports.request = request
